package com.longkier.gx_library_springboot.utils;

import com.longkier.gx_library_springboot.exception.CustomException;
import org.jetbrains.annotations.Contract;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class RequestUtils {

    /**
     * 处理用户ID列表。
     *
     * @param IdsObj 用户ID列表对象
     * @return 用户ID列表
     * @throws IllegalArgumentException 如果用户ID列表格式不正确
     */
    @Contract("null -> fail")
    public static @NotNull List<Long> processIds(Object IdsObj) {
        if (IdsObj instanceof List<?> IdsList) {
            List<Long> Ids = new ArrayList<>();
            for (Object id : IdsList) {
                if (id instanceof Number) {
                    Ids.add(((Number) id).longValue());
                } else {
                    throw new CustomException(400, "用户ID列表格式不正确");
                }
            }
            return Ids;
        } else {
            throw new CustomException(400, "用户ID列表格式不正确");
        }
    }

    /**
     * 从请求中获取 Long 类型的值。
     *
     * @param request 请求体
     * @return Long 类型的值，如果不存在则返回 null
     */
    public static @Nullable Long getLongFromRequest(@NotNull Map<String, Object> request) {
        return request.containsKey("userId") ? Long.valueOf(request.get("userId").toString()) : null;
    }

    /**
     * 从请求中获取 String 类型的值。
     *
     * @param request 请求体
     * @param key 要获取的键名，可以是 "cardNumber" 或 "bookNumber"
     * @return String 类型的值，如果不存在则返回 null
     */
    public static @Nullable String getStringFromRequest(@NotNull Map<String, Object> request, @NotNull String key) {
        return request.containsKey(key) && !request.get(key).equals("") ? request.get(key).toString() : null;
    }

    /**
     * 构建包含消息和错误码的成功或失败响应。
     *
     * @param data 响应消息
     * @param code   响应码
     * @return 包含消息和错误码的成功或失败响应 Map
     */
    public static @NotNull Map<String, Object> buildResponse(Object data, Integer code) {
        Map<String, Object> response = new HashMap<>();
        response.put("data", data);
        if (data != null && code == 200) {
            response.put("status", true);
            response.put("code", code);
        }
        else{
            response.put("status", false);
            response.put("code", code);
        }
        return response;
    }

    /**
     * 构建11位随机数。
     *
     * @return 11位随机数字符串
     */
    public static @NotNull String generateRandom11Number() {
        long lowerBound = 1_000_000_0000L;
        long upperBound = 9_999_999_9999L;
        return String.valueOf(lowerBound + (long) (Math.random() * (upperBound - lowerBound)));
    }

}
